Skip to main content

第 2 章:檔案與目錄管理

絕對路徑與相對路徑

  • 絕對路徑:由根目錄(/)開始寫起的檔名或目錄名稱, 例如 /home/dmtsai/.bashrc;
  • 相對路徑:相對於目前路徑的檔名寫法。 例如 ./home/dmtsai 或 ../../home/dmtsai/ 等等。反正開頭不是 / 就屬於相對路徑的寫法

目錄的相關操作

符號敘述
.代表此層目錄
..代表上一層目錄
-代表前一個工作目錄
~代表『目前使用者身份』所在的家目錄
~account代表 account 這個使用者的家目錄

cd change directory 變換目錄

cd
cd [相對路徑或絕對路徑] # 最重要的就是目錄的絕對路徑與相對路徑,還有一些特殊目錄的符號囉!
cd ~dmtsai # 代表去到 dmtsai 這個使用者的家目錄,亦即 /home/dmtsai
cd ~ # 表示回到自己的家目錄,亦即是 /root 這個目錄
cd # 沒有加上任何路徑,也還是代表回到自己家目錄的意思喔!
cd .. # 表示去到目前的上層目錄,亦即是 /root 的上層目錄的意思;
cd - # 表示回到剛剛的那個目錄,也就是 /root 囉~
cd /var/spool/mail # 這個就是絕對路徑的寫法!直接指定要去的完整路徑名稱!
cd ../postfix # 這個是相對路徑的寫法,我們由 /var/spool/mail 去到 /var/spool/postfix

pwd 顯示目前所在的目錄

pwd
pwd [-P]

# 選項與參數:
# -P :顯示出確實的路徑,而非使用連結 (link) 路徑。範例:單純顯示出目前的工作目錄

mkdir 建立新目錄

mkdir
mkdir [-mp] 目錄名稱

選項與參數:
-m :設定檔案的權限喔!直接設定,不需要看預設權限 (umask)
-p :幫助你直接將所需要的目錄(包含上層目錄)遞迴建立起來!範例:請到/tmp底下嘗試建立數個新目錄看看

rmdir 刪除空的目錄

rmdir
rmdir [-p] 目錄名稱

選項與參數:
-p :連同『上層』『空的』目錄也一起刪除範例:將於mkdir範例中建立的目錄(/tmp底下)刪除掉!

執行檔路徑的變數: $PATH

$PATH
echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

ls 檔案與目錄的檢視

ls
ls [-aAdfFhilnrRSt] 檔名或目錄名稱..
ls [--color={never,auto,always}] 檔名或目錄名稱..
ls [--full-time] 檔名或目錄名稱..

選項與參數:
-a :全部的檔案,連同隱藏檔( 開頭為 . 的檔案) 一起列出來(常用)
-A :全部的檔案,連同隱藏檔,但不包括 . 與 .. 這兩個目錄
-d :僅列出目錄本身,而不是列出目錄內的檔案資料(常用)
-f :直接列出結果,而不進行排序 (ls 預設會以檔名排序!)
-F :根據檔案、目錄等資訊,給予附加資料結構,例如:
*:代表可執行檔; /:代表目錄; =:代表 socket 檔案; |:代表 FIFO 檔案;
-h :將檔案容量以人類較易讀的方式(例如 GB, KB 等等)列出來;
-i :列出 inode 號碼,inode 的意義下一章將會介紹;
-l :長資料串列出,包含檔案的屬性與權限等等資料;(常用)
-n :列出 UID 與 GID 而非使用者與群組的名稱 (UID與GID會在帳號管理提到!)
-r :將排序結果反向輸出,例如:原本檔名由小到大,反向則為由大到小;
-R :連同子目錄內容一起列出來,等於該目錄下的所有檔案都會顯示出來;
-S :以檔案容量大小排序,而不是用檔名排序;
-t :依時間排序,而不是用檔名。
--color=never :不要依據檔案特性給予顏色顯示;
--color=always :顯示顏色
--color=auto :讓系統自行依據設定來判斷是否給予顏色
--full-time :以完整時間模式 (包含年、月、日、時、分) 輸出
--time={atime,ctime} :輸出 access 時間或改變權限屬性時間 (ctime)
而非內容變更時間 (modification time)

cp 複製檔案或目錄

cp
cp [-adfilprsu] 來源檔(source) 目標檔(destination)
cp [options] source1 source2 source3 .... directory

選項與參數:
-a :相當於 -dr --preserve=all 的意思,至於 dr 請參考下列說明;(常用)
-d :若來源檔為連結檔的屬性(link file),則複製連結檔屬性而非檔案本身;
-f :為強制(force)的意思,若目標檔案已經存在且無法開啟,則移除後再嘗試一次;
-i :若目標檔(destination)已經存在時,在覆蓋時會先詢問動作的進行(常用)
-l :進行硬式連結(hard link)的連結檔建立,而非複製檔案本身;
-p :連同檔案的屬性(權限、用戶、時間)一起複製過去,而非使用預設屬性(備份常用);
-r :遞迴持續複製,用於目錄的複製行為;(常用)
-s :複製成為符號連結檔 (symbolic link),亦即『捷徑』檔案;
-u :destination 比 source 舊才更新 destination,或 destination 不存在的情況下才複製。
--preserve=all :除了 -p 的權限相關參數外,還加入 SELinux 的屬性, links, xattr 等也複製了。

由於 cp 有種種的檔案屬性與權限的特性,所以,在複製時,你必須要清楚的瞭解到:

  • 是否需要完整的保留來源檔案的資訊?
  • 來源檔案是否為連結檔 (symbolic link file)?
  • 來源檔是否為特殊的檔案,例如 FIFO, socket 等?
  • 來源檔是否為目錄?

rm 移除檔案或目錄

rm
rm [-fir] 檔案或目錄

選項與參數:
-f :就是 force 的意思,忽略不存在的檔案,不會出現警告訊息;
-i :互動模式,在刪除前會詢問使用者是否動作
-r :遞迴刪除啊!最常用在目錄的刪除了!這是非常危險的選項!!!範例一:將剛剛在 cp 的範例中建立的 bashrc 刪除掉!

mv 移動檔案與目錄或更名

mv
mv [-fiu] source destination
mv [options] source1 source2 source3 .... directory

選項與參數:
-f :force 強制的意思,如果目標檔案已經存在,不會詢問而直接覆蓋;
-i :若目標檔案 (destination) 已經存在時,就會詢問是否覆蓋!
-u :若目標檔案已經存在,且 source 比較新,才會更新 (update)範例一:複製一檔案,建立一目錄,將檔案移動到目錄中

basename 取得路徑的檔案名稱與目錄名稱

basename
basename /etc/sysconfig/network
network <== 很簡單!就取得最後的檔名~

dirname /etc/sysconfig/network
/etc/sysconfig <== 取得的變成目錄名了!

cat 檢視檔案內容

cat
cat [-AbEnTv]

選項與參數:
-A :相當於 -vET 的整合選項,可列出一些特殊字符而不是空白而已;
-b :列出行號,僅針對非空白行做行號顯示,空白行不標行號!
-E :將結尾的斷行字元 $ 顯示出來;
-n :列印出行號,連同空白行也會有行號,與 -b 的選項不同;
-T :將 [tab] 按鍵以 ^I 顯示出來;
-v :列出一些看不出來的特殊字符範例一:檢閱 /etc/issue 這個檔案的內容

cat /etc/issue
\S
Kernel \r on an \m

tac 反向檢視檔案內容

tac
tac /etc/issue

Kernel \r on an \m
\S

nl 添加行號列印

nl
nl [-bnw] 檔案

選項與參數:
-b :指定行號指定的方式,主要有兩種:
-b a :表示不論是否為空行,也同樣列出行號(類似 cat -n);
-b t :如果有空行,空的那一行不要列出行號(預設值);
-n :列出行號表示的方法,主要有三種:
-n ln :行號在螢幕的最左方顯示;
-n rn :行號在自己欄位的最右方顯示,且不加 0 ;
-n rz :行號在自己欄位的最右方顯示,且加 0 ;
-w :行號欄位的佔用的字元數。範例一:用 nl 列出 /etc/issue 的內容
nl /etc/issue
1 \S
2 Kernel \r on an \m

more 可翻頁檢視,一頁一頁翻動

more
more /etc/man_db.conf

# This file is used by the man-db package to configure the man and cat paths.
# It is also used to provide a manpath for those without one by examining
# their PATH environment variable. For details see the manpath(5) man page.
#
.....(中間省略).....--More--(28%) <== 重點在這一行喔!你的游標也會在這裡等待你的指令
  • 空白鍵 (space):代表向下翻一頁;
  • Enter :代表向下翻『一行』;
  • /字串 :代表在這個顯示的內容當中,向下搜尋『字串』這個關鍵字;
  • :f :立刻顯示出檔名以及目前顯示的行數;
  • q :代表立刻離開 more ,不再顯示該檔案內容。
  • b 或 [ctrl]-b :代表往回翻頁,不過這動作只對檔案有用,對管線無用。

less 可翻頁檢視,一頁一頁翻動

less
less /etc/man_db.conf

# This file is used by the man-db package to configure the man and cat paths.
# It is also used to provide a manpath for those without one by examining
# their PATH environment variable. For details see the manpath(5) man page.
#
.....(中間省略).....
: <== 這裡可以等待你輸入指令!

less 的用法比起 more 又更加的有彈性,可以使用 [pageup] [pagedown] 等按鍵的功能來往前往後翻看文件

  • 空白鍵 :向下翻動一頁;
  • [pagedown]:向下翻動一頁;
  • [pageup] :向上翻動一頁;
  • /字串 :向下搜尋『字串』的功能;
  • ?字串 :向上搜尋『字串』的功能;
  • n :重複前一個搜尋 (與 / 或 ? 有關!)
  • N :反向的重複前一個搜尋 (與 / 或 ? 有關!)
  • g :前進到這個資料的第一行去;
  • G :前進到這個資料的最後一行去 (注意大小寫);
  • q :離開 less 這個程式;

head 取出資料前面幾行

head
head [-n number] 檔案

選項與參數:
-n :後面接數字,代表顯示幾行的意思

tail 取出資料後面幾行

tail
tail [-n number] 檔案

選項與參數:
-n :後面接數字,代表顯示幾行的意思
-f :表示持續偵測後面所接的檔名,要等到按下[ctrl]-c才會結束tail的偵測

od 查看非純文字檔

od
od [-t TYPE] 檔案

選項或參數:
-t :後面可以接各種『類型 (TYPE)』的輸出,例如:
a :利用預設的字元來輸出;
c :使用 ASCII 字元來輸出
d[size] :利用十進位(decimal)來輸出資料,每個整數佔用 size bytes ;
f[size] :利用浮點數值(floating)來輸出資料,每個數佔用 size bytes ;
o[size] :利用八進位(octal)來輸出資料,每個整數佔用 size bytes ;
x[size] :利用十六進位(hexadecimal)來輸出資料,每個整數佔用 size bytes ;範例一:請將/usr/bin/passwd的內容使用ASCII方式來展現!

od -t c /usr/bin/passwd
0000000 177 E L F 002 001 001 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000020 003 \0 > \0 001 \0 \0 \0 364 3 \0 \0 \0 \0 \0 \0
0000040 @ \0 \0 \0 \0 \0 \0 \0 x e \0 \0 \0 \0 \0 \0
0000060 \0 \0 \0 \0 @ \0 8 \0 \t \0 @ \0 035 \0 034 \0
0000100 006 \0 \0 \0 005 \0 \0 \0 @ \0 \0 \0 \0 \0 \0 \0
.....(後面省略)....

# 最左邊第一欄是以 8 進位來表示bytes數。以上面範例來說,第二欄0000020代表開頭是
# 第 16 個 byes (2x8) 的內容之意。範例二:請將/etc/issue這個檔案的內容以8進位列出儲存值與ASCII的對照表

od -t oCc /etc/issue
0000000 134 123 012 113 145 162 156 145 154 040 134 162 040 157 156 040
\ S \n K e r n e l \ r o n
0000020 141 156 040 134 155 012 012
a n \ m \n \n
0000027
# 如上所示,可以發現每個字元可以對應到的數值為何!要注意的是,該數值是 8 進位喔!
# 例如 S 對應的記錄數值為 123 ,轉成十進位:1x8^2+2x8+3=83。

touch 修改檔案時間或建置新檔

每個檔案在 linux 會記錄許多的時間參數, 其實是有三個主要的變動時間

  • modification time (mtime):當該檔案的『內容資料』變更時,就會更新這個時間!內容資料指的是檔案的內容,而不是檔案的屬性或權限喔!
  • status time (ctime):當該檔案的『狀態 (status)』改變時,就會更新這個時間,舉例來說,像是權限與屬性被更改了,都會更新這個時間啊。
  • access time (atime):當『該檔案的內容被取用』時,就會更新這個讀取時間 (access)。舉例來說,我們使用 cat 去讀取 /etc/man_db.conf , 就會更新該檔案的 atime 了。
touch
date; ls -l /etc/man_db.conf ; ls -l --time=atime /etc/man_db.conf ; \
>ls -l --time=ctime /etc/man_db.conf # 這兩行其實是同一行喔!用分號隔開
Tue Jun 16 00:43:17 CST 2015 # 目前的時間啊!
-rw-r--r--. 1 root root 5171 Jun 10 2014 /etc/man_db.conf # 在 2014/06/10 建立的內容(mtime)
-rw-r--r--. 1 root root 5171 Jun 15 23:46 /etc/man_db.conf # 在 2015/06/15 讀取過內容(atime)
-rw-r--r--. 1 root root 5171 May 4 17:54 /etc/man_db.conf # 在 2015/05/04 更新過狀態(ctime)
# 為了要讓資料輸出比較好看,將三個指令同時依序執行,三個指令中間用分號 (;) 隔開即可
touch [-acdmt] 

檔案選項與參數:
-a :僅修訂 access time;
-c :僅修改檔案的時間,若該檔案不存在則不建立新檔案;
-d :後面可以接欲修訂的日期而不用目前的日期,也可以使用 --date="日期或時間"
-m :僅修改 mtime ;
-t :後面可以接欲修訂的時間而不用目前的時間,格式為[YYYYMMDDhhmm]範例一:新建一個空的檔案並觀察時間

cd /tmp
touch testtouch
ls -l testtouch
-rw-rw-r--. 1 dmtsai dmtsai 0 Jun 16 00:45 testtouch

# 注意到,這個檔案的大小是 0 呢!在預設的狀態下,如果 touch 後面有接檔案,
# 則該檔案的三個時間 (atime/ctime/mtime) 都會更新為目前的時間。若該檔案不存在,
# 則會主動的建立一個新的空的檔案喔!例如上面這個例子!範例二:將 ~/.bashrc 複製成為 bashrc,假設複製完全的屬性,檢查其日期

cp -a ~/.bashrc bashrc
date; ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc

Tue Jun 16 00:49:24 CST 2015 <==這是目前的時間
-rw-r--r--. 1 dmtsai dmtsai 231 Mar 6 06:06 bashrc <==這是 mtime
-rw-r--r--. 1 dmtsai dmtsai 231 Jun 15 23:44 bashrc <==這是 atime
-rw-r--r--. 1 dmtsai dmtsai 231 Jun 16 00:47 bashrc <==這是 ctime

檔案預設權限:umask

umask
umask
0022 <==與一般權限有關的是後面三個數字!

umask -S
u=rwx,g=rx,o=r
  • 若使用者建立為『檔案』則預設『沒有可執行( x )權限』,亦即只有 rw 這兩個項目,也就是最大為 666 分,預設權限如下:rw-rw-rw-
  • 若使用者建立為『目錄』,則由於 x 與是否可以進入此目錄有關,因此預設為所有權限均開放,亦即為 777 分,預設權限如下:drwxrwxrwx

umask 的分數指的是『該預設值需要減掉的權限!』因為 r、w、x 分別是 4、2、1 分,所以囉!也就是說,當要拿掉能寫的權限,就是輸入 2 分,而如果要拿掉能讀的權限,也就是 4 分,那麼要拿掉讀與寫的權限,也就是 6 分,而要拿掉執行與寫入的權限,也就是 3 分。:::

如果 umask 為 022 ,所以 user 並沒有被拿掉任何權限,不過 group 與 others 的權限被拿掉了 2 (也就是 w 這個權限),那麼當使用者:

  • 建立檔案時:(-rw-rw-rw-) - (-----w--w-) ==> -rw-r--r--
  • 建立目錄時:(drwxrwxrwx) - (d----w--w-) ==> drwxr-xr-x
umask on file
umask
0022

touch test1
mkdir test2
ll -d test*

-rw-r--r--. 1 root root 0 6月 16 01:11 test1
drwxr-xr-x. 2 root root 6 6月 16 01:11 test2

chattr 設定檔案隱藏屬性

只能在Ext2/Ext3/Ext4的 Linux 傳統檔案系統上面完整生效, 其他的檔案系統可能就無法完整的支援這個指令了,例如 xfs 僅支援部份參數而已

chattr
chattr [+-=][ASacdistu] 檔案或目錄名稱

選項與參數:
+ :增加某一個特殊參數,其他原本存在參數則不動。
- :移除某一個特殊參數,其他原本存在參數則不動。
= :設定一定,且僅有後面接的參數

A :當設定了 A 這個屬性時,若你有存取此檔案(或目錄)時,他的存取時間 atime 將不會被修改,
可避免 I/O 較慢的機器過度的存取磁碟。(目前建議使用檔案系統掛載參數處理這個項目)
S :一般檔案是非同步寫入磁碟的(原理請參考前一章sync的說明),如果加上 S 這個屬性時,
當你進行任何檔案的修改,該更動會『同步』寫入磁碟中。
a :當設定 a 之後,這個檔案將只能增加資料,而不能刪除也不能修改資料,只有root 才能設定這屬性
c :這個屬性設定之後,將會自動的將此檔案『壓縮』,在讀取的時候將會自動解壓縮,
但是在儲存的時候,將會先進行壓縮後再儲存(看來對於大檔案似乎蠻有用的!)
d :當 dump 程序被執行的時候,設定 d 屬性將可使該檔案(或目錄)不會被 dump 備份
i :這個 i 可就很厲害了!他可以讓一個檔案『不能被刪除、改名、設定連結也無法寫入或新增資料!』
對於系統安全性有相當大的助益!只有 root 能設定此屬性
s :當檔案設定了 s 屬性時,如果這個檔案被刪除,他將會被完全的移除出這個硬碟空間,
所以如果誤刪了,完全無法救回來了喔!
u :與 s 相反的,當使用 u 來設定檔案時,如果該檔案被刪除了,則資料內容其實還存在磁碟中,
可以使用來救援該檔案喔!

注意 1:屬性設定常見的是 a 與 i 的設定值,而且很多設定值必須要身為 root 才能設定
注意 2:xfs 檔案系統僅支援 AadiS 而已範例:請嘗試到/tmp底下建立檔案,並加入 i 的參數,嘗試刪除看看。

cd /tmp
touch attrtest <==建立一個空檔案
chattr +i attrtest <==給予 i 的屬性
rm attrtest <==嘗試刪除看看
rm: remove regular empty file `attrtest'?y
rm: cannot remove `attrtest': Operation not permitted

chattr -i attrtest

lsattr 顯示檔案隱藏屬性

lsattr
lsattr [-adR] 檔案或目錄

選項與參數:
-a :將隱藏檔的屬性也秀出來;
-d :如果接的是目錄,僅列出目錄本身的屬性而非目錄內的檔名;
-R :連同子目錄的資料也一併列出來!

chattr +aiS attrtest
lsattr attrtest
--S-ia---------- attrtest

SUID & SGID & SBIT

SUID & SGID & SBIT
ls -ld /tmp ; ls -l /usr/bin/passwd

drwxrwxrwt. 14 root root 4096 Jun 16 01:27 /tmp
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
  • 特殊權限:s 跟 t

Set UID

當 s 這個標誌出現在檔案擁有者的 x 權限上時,此時就被稱為 Set UID,簡稱為 SUID 的特殊權限。

  • SUID 權限僅對二進位程式(binary program)有效;
  • 執行者對於該程式需要具有 x 的可執行權限;
  • 本權限僅在執行該程式的過程中有效 (run-time);
  • 執行者將具有該程式擁有者 (owner) 的權限。

Linux 系統中,所有帳號的密碼都記錄在 /etc/shadow 這個檔案裡面,這個檔案的權限為:『---------- 1 root root』,意思是這個檔案僅有root可讀且僅有root可以強制寫入而已。 既然這個檔案僅有 root 可以修改,那麼 dmtsai 這個一般帳號使用者能否自行修改自己的密碼呢? 你可以使用你自己的帳號輸入『passwd』這個指令來看看,嘿嘿!一般使用者當然可以修改自己的密碼了!

唔!有沒有衝突啊!明明 /etc/shadow 就不能讓 dmtsai 這個一般帳戶去存取的,為什麼 dmtsai 還能夠修改這個檔案內的密碼呢? 這就是 SUID 的功能啦!藉由上述的功能說明,我們可以知道

  1. dmtsai 對於 /usr/bin/passwd 這個程式來說是具有 x 權限的,表示 dmtsai 能執行 passwd;
  2. passwd 的擁有者是 root 這個帳號;
  3. dmtsai 執行 passwd 的過程中,會『暫時』獲得 root 的權限;
  4. /etc/shadow 就可以被 dmtsai 所執行的 passwd 所修改。

但如果 dmtsai 使用 cat 去讀取 /etc/shadow 時,他能夠讀取嗎?因為 cat 不具有 SUID 的權限,所以 dmtsai 執行 『cat /etc/shadow』 時,是不能讀取 /etc/shadow 的。我們用一張示意圖來說明如下:

Set GID

當 s 標誌在檔案擁有者的 x 項目為 SUID,那 s 在群組的 x 時則稱為 Set GID, SGID

ls -l /usr/bin/locate
-rwx--s--x. 1 root slocate 40496 Jun 10 2014 /usr/bin/locate

與 SUID 不同的是,SGID 可以針對檔案或目錄來設定!如果是對檔案來說, SGID 有如下的功能:

  • SGID 對二進位程式有用;
  • 程式執行者對於該程式來說,需具備 x 的權限;
  • 執行者在執行的過程中將會獲得該程式群組的支援!
ll /usr/bin/locate /var/lib/mlocate/mlocate.db
-rwx--s--x. 1 root slocate 40496

Jun 10 2014 /usr/bin/locate
-rw-r-----. 1 root slocate 2349055 Jun 15 03:44 /var/lib/mlocate/mlocate.db

除了 binary program 之外,事實上 SGID 也能夠用在目錄上。 當一個目錄設定了 SGID 的權限後,將具有如下的功能:

  • 使用者若對於此目錄具有 r 與 x 的權限時,該使用者能夠進入此目錄;
  • 使用者在此目錄下的有效群組(effective group)將會變成該目錄的群組;
  • 用途:若使用者在此目錄下具有 w 的權限(可以新建檔案),則使用者所建立的新檔案,該新檔案的群組與此目錄的群組相同。

Sticky Bit

這個 Sticky Bit, SBIT 目前只針對目錄有效,對於檔案已經沒有效果了。SBIT 對於目錄的作用

  • 當使用者對於此目錄具有 w, x 權限,亦即具有寫入的權限時;
  • 當使用者在該目錄下建立檔案或目錄時,僅有自己與 root 才有權力刪除該檔案

換句話說:當甲這個使用者於 A 目錄是具有群組或其他人的身份,並且擁有該目錄 w 的權限, 這表示『甲使用者對該目錄內任何人建立的目錄或檔案均可進行 "刪除/更名/搬移" 等動作。』 不過,如果將 A 目錄加上了 SBIT 的權限項目時, 則甲只能夠針對自己建立的檔案或目錄進行刪除/更名/移動等動作,而無法刪除他人的檔案。

SUID/SGID/SBIT 權限設定

  • 4 為 SUID
  • 2 為 SGID
  • 1 為 SBIT

假設要將一個檔案權限改為『-rwsr-xr-x』時,由於 s 在使用者權限中,所以是 SUID ,因此, 在原先的 755 之前還要加上 4 ,也就是:『 chmod 4755 filename 』來設定!此外,還有大 S 與大 T 的產生喔!參考底下的範例啦!

SUID/SGID/SBIT
cd /tmp
touch test <==建立一個測試用空檔
chmod 4755 test; ls -l test <==加入具有 SUID 的權限
-rwsr-xr-x 1 root root 0 Jun 16 02:53 test

chmod 6755 test; ls -l test <==加入具有 SUID/SGID 的權限
-rwsr-sr-x 1 root root 0 Jun 16 02:53 test

chmod 1755 test; ls -l test <==加入 SBIT 的功能!
-rwxr-xr-t 1 root root 0 Jun 16 02:53 test

chmod 7666 test; ls -l test <==具有空的 SUID/SGID 權限
-rwSrwSrwT 1 root root 0 Jun 16 02:53 test
# 設定權限成為 -rws--x--x 的模樣:

chmod u=rwxs,go=x test; ls -l test
-rws--x--x 1 root root 0 Jun 16 02:53 test

# 承上,加上 SGID 與 SBIT 在上述的檔案權限中!

chmod g+s,o+t test; ls -l test
-rws--s--t 1 root root 0 Jun 16 02:53 test

file 觀察檔案類型

file
file ~/.bashrc
/root/.bashrc: ASCII text <==告訴我們是 ASCII 的純文字檔啊!

file /usr/bin/passwd
/usr/bin/passwd: setuid ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically
linked (uses shared libs), for GNU/Linux 2.6.32,
BuildID[sha1]=0xbf35571e607e317bf107b9bcf65199988d0ed5ab, stripped

# 執行檔的資料可就多的不得了!包括這個檔案的 suid 權限、相容於 Intel x86-64 等級的硬體平台
# 使用的是 Linux 核心 2.6.32 的動態函式庫連結等等。

file /var/lib/mlocate/mlocate.db
/var/lib/mlocate/mlocate.db: data <== 這是 data 檔案!

which 尋找執行檔

which
which [-a] command

選項或參數:
-a :將所有由 PATH 目錄中可以找到的指令均列出,而不止第一個被找到的指令名稱範例一:搜尋 ifconfig 這個指令的完整檔名

which ifconfig
/sbin/ifconfig

範例二:用 which 去找出 which 的檔名為何?
which which
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
/bin/alias
/usr/bin/which

# 竟然會有兩個 which ,其中一個是 alias 這玩意兒呢!那是啥?
# 那就是所謂的『命令別名』,意思是輸入 which 會等於後面接的那串指令啦!
# 更多的資料我們會在 bash 章節中再來談的!範例三:請找出 history 這個指令的完整檔名
which history
/usr/bin/which: no history in (/usr/local/sbin:/usr/local/bin:/sbin:/bin:
/usr/sbin:/usr/bin:/root/bin)

history --help
-bash: history: --: invalid option
history: usage: history [-c] [-d offset] [n] or history -anrw [filename] or history -ps arg

whereis 由一些特定的目錄中尋找檔案檔名

whereis
whereis [-bmsu] 檔案或目錄名

選項與參數:
-l :可以列出 whereis 會去查詢的幾個主要目錄而已
-b :只找 binary 格式的檔案
-m :只找在說明檔 manual 路徑下的檔案
-s :只找 source 來源檔案
-u :搜尋不在上述三個項目當中的其他特殊檔案範例一:請找出 ifconfig 這個檔名

whereis ifconfig
ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz

範例二:只找出跟 passwd 有關的『說明文件』檔名(man page)

whereis passwd
# 全部的檔名通通列出來!

passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz

whereis -m passwd
# 只有在 man 裡面的檔名才抓出來!
passwd: /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz

locate / updatedb

locate
locate [-ir] keyword選項與參數:
-i :忽略大小寫的差異;
-c :不輸出檔名,僅計算找到的檔案數量
-l :僅輸出幾行的意思,例如輸出五行則是 -l 5
-S :輸出 locate 所使用的資料庫檔案的相關資訊,包括該資料庫紀錄的檔案/目錄數量等
-r :後面可接正規表示法的顯示方式範例一:找出系統中所有與 passwd 相關的檔名,且只列出 5 個

locate -l 5 passwd
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/etc/security/opasswd
/usr/bin/gpasswd

範例二:列出 locate 查詢所使用的資料庫檔案之檔名與各資料數量
locate -S
Database /var/lib/mlocate/mlocate.db:
8,086 directories # 總紀錄目錄數
109,605 files # 總紀錄檔案數
5,190,295 bytes in file names
2,349,150 bytes used to store database

Locate 是經由資料庫來搜尋的,而資料庫的建立預設是在每天執行一次,所以當你新建立起來的檔案, 卻還在資料庫更新之前搜尋該檔案,那麼 locate 會告訴你『找不到!』呵呵!因為必須要更新資料庫呀!

那能否手動更新資料庫哪?當然可以啊!更新 locate 資料庫的方法非常簡單,直接輸入『 updatedb 』就可以了! updatedb 指令會去讀取 /etc/updatedb.conf 這個設定檔的設定,然後再去硬碟裡面進行搜尋檔名的動作, 最後就更新整個資料庫檔案囉!因為 updatedb 會去搜尋硬碟,所以當你執行 updatedb 時,可能會等待數分鐘的時間喔!

  • updatedb:根據 /etc/updatedb.conf 的設定去搜尋系統硬碟內的檔名,並更新 /var/lib/mlocate 內的資料庫檔案;
  • locate:依據 /var/lib/mlocate 內的資料庫記載,找出使用者輸入的關鍵字檔名。

find

find
find [PATH] [option] [action]選項與參數:

1. 與時間有關的選項:共有 -atime, -ctime 與 -mtime ,以 -mtime 說明
-mtime n :n 為數字,意義為在 n 天之前的『一天之內』被更動過內容的檔案;
-mtime +n :列出在 n 天之前(不含 n 天本身)被更動過內容的檔案檔名;
-mtime -n :列出在 n 天之內(含 n 天本身)被更動過內容的檔案檔名。
-newer file :file 為一個存在的檔案,列出比 file 還要新的檔案檔名範例一:將過去系統上面 24 小時內有更動過內容 (mtime) 的檔案列出

find / -mtime 0

# 那個 0 是重點!0 代表目前的時間,所以,從現在開始到 24 小時前,
# 有變動過內容的檔案都會被列出來!那如果是三天前的 24 小時內?
# find / -mtime 3 有變動過的檔案都被列出的意思!範例二:尋找 /etc 底下的檔案,如果檔案日期比 /etc/passwd 新就列出
[root@study ~]#find /etc -newer /etc/passwd# -newer 用在分辨兩個檔案之間的新舊關係是很有用的!
  • +4 代表大於等於5天前的檔名:ex> find /var -mtime +4
  • -4 代表小於等於 4 天內的檔案檔名:ex> find /var -mtime -4
  • 4 則是代表 4-5 那一天的檔案檔名:ex> find /var -mtime 4
find
選項與參數:
2. 與使用者或群組名稱有關的參數:
-uid n :n 為數字,這個數字是使用者的帳號 ID,亦即 UID ,這個 UID 是記錄在
/etc/passwd 裡面與帳號名稱對應的數字。這方面我們會在第四篇介紹。
-gid n :n 為數字,這個數字是群組名稱的 ID,亦即 GID,這個 GID 記錄在
/etc/group,相關的介紹我們會第四篇說明~
-user name :name 為使用者帳號名稱喔!例如 dmtsai
-group name:name 為群組名稱喔,例如 users ;
-nouser :尋找檔案的擁有者不存在 /etc/passwd 的人!
-nogroup :尋找檔案的擁有群組不存在於 /etc/group 的檔案!
當你自行安裝軟體時,很可能該軟體的屬性當中並沒有檔案擁有者,
這是可能的!在這個時候,就可以使用 -nouser 與 -nogroup 搜尋。範例三:搜尋 /home 底下屬於 dmtsai 的檔案

find /home -user dmtsai

# 這個東西也很有用的~當我們要找出任何一個使用者在系統當中的所有檔案時,
# 就可以利用這個指令將屬於某個使用者的所有檔案都找出來喔!範例四:搜尋系統中不屬於任何人的檔案

find / -nouser

# 透過這個指令,可以輕易的就找出那些不太正常的檔案。如果有找到不屬於系統任何人的檔案時,
# 不要太緊張,那有時候是正常的~尤其是你曾經以原始碼自行編譯軟體時。

如果你想要找出某個使用者在系統底下建立了啥咚咚,使用上述的選項與參數,就能夠找出來啦! 至於那個 -nouser 或 -nogroup 的選項功能中,除了你自行由網路上面下載檔案時會發生之外, 如果你將系統裡面某個帳號刪除了,但是該帳號已經在系統內建立很多檔案時,就可能會發生無主孤魂的檔案存在! 此時你就得使用這個 -nouser 來找出該類型的檔案囉!

find
選項與參數:
3. 與檔案權限及名稱有關的參數:
-name filename:搜尋檔案名稱為 filename 的檔案;
-size [+-]SIZE:搜尋比 SIZE 還要大(+)或小(-)的檔案。這個 SIZE 的規格有:
c: 代表 byte, k: 代表 1024bytes。所以,要找比 50KB
還要大的檔案,就是『 -size +50k 』
-type TYPE :搜尋檔案的類型為 TYPE 的,類型主要有:一般正規檔案 (f), 裝置檔案 (b, c),
目錄 (d), 連結檔 (l), socket (s), 及 FIFO (p) 等屬性。
-perm mode :搜尋檔案權限『剛好等於』 mode 的檔案,這個 mode 為類似 chmod
的屬性值,舉例來說, -rwsr-xr-x 的屬性為 4755 !
-perm -mode :搜尋檔案權限『必須要全部囊括 mode 的權限』的檔案,舉例來說,
我們要搜尋 -rwxr--r-- ,亦即 0744 的檔案,使用 -perm -0744,
當一個檔案的權限為 -rwsr-xr-x ,亦即 4755 時,也會被列出來,
因為 -rwsr-xr-x 的屬性已經囊括了 -rwxr--r-- 的屬性了。
-perm /mode :搜尋檔案權限『包含任一 mode 的權限』的檔案,舉例來說,我們搜尋
-rwxr-xr-x ,亦即 -perm /755 時,但一個檔案屬性為 -rw-------
也會被列出來,因為他有 -rw.... 的屬性存在!範例五:找出檔名為 passwd 這個檔案

find / -name passwd

# 範例五-1:找出檔名包含了 passwd 這個關鍵字的檔案

find / -name "*passwd*"

# 利用這個 -name 可以搜尋檔名啊!預設是完整檔名,如果想要找關鍵字,
# 可以使用類似 * 的任意字元來處理範例六:找出 /run 目錄下,檔案類型為 Socket 的檔名有哪些?

find /run -type s

# 這個 -type 的屬性也很有幫助喔!尤其是要找出那些怪異的檔案,
# 例如 socket 與 FIFO 檔案,可以用 find /run -type p 或 -type s 來找!範例七:搜尋檔案當中含有 SGID 或 SUID 或 SBIT 的屬性

find / -perm /7000

# 所謂的 7000 就是 ---s--s--t ,那麼只要含有 s 或 t 的就列出,所以當然要使用 /7000,
# 使用 -7000 表示要同時含有 ---s--s--t 的所有三個權限。而只需要任意一個,就是 /7000 ~瞭乎?

上述範例中比較有趣的就屬 -perm 這個選項啦!他的重點在找出特殊權限的檔案囉! 我們知道 SUID 與 SGID 都可以設定在二進位程式上,假設我想要找出來 /usr/bin, /usr/sbin 這兩個目錄下, 只要具有 SUID 或 SGID 就列出來該檔案,你可以這樣做:

find SUID
find /usr/bin /usr/sbin -perm /6000

因為 SUID 是 4 分,SGID 2 分,總共為 6 分,因此可用 /6000 來處理這個權限! 至於 find 後面可以接多個目錄來進行搜尋!另外, find 本來就會搜尋次目錄,這個特色也要特別注意喔! 最後,我們再來看一下 find 還有什麼特殊功能吧!

find exec
選項與參數:
4. 額外可進行的動作:
-exec command :command 為其他指令,-exec 後面可再接額外的指令來處理搜尋到的結果。
-print :將結果列印到螢幕上,這個動作是預設動作!範例八:將上個範例找到的檔案使用 ls -l 列出來~

find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} \;

# 注意到,那個 -exec 後面的 ls -l 就是額外的指令,指令不支援命令別名,
# 所以僅能使用 ls -l 不可以使用 ll 喔!注意注意!範例九:找出系統中,大於 1MB 的檔案

find / -size +1M
  • 代表的是『由 find 找到的內容』,如上圖所示,find 的結果會被放置到 位置中;
  • exec 一直到 ; 是關鍵字,代表 find 額外動作的開始 (-exec) 到結束 (;) ,在這中間的就是 find 指令內的額外動作。 在本例中就是『 ls -l 』囉!
  • 因為『 ; 』在 bash 環境下是有特殊意義的,因此利用反斜線來跳脫。
find inventory
find /etc -name '*httpd*'

不但可以指定搜尋的目錄(連同次目錄),並且可以利用額外的選項與參數來找到最正確的檔名!真是好好用! 不過由於 find 在尋找資料的時後相當的操硬碟!所以沒事情不要使用 find 啦!有更棒的指令可以取代呦!那就是上面提到的 whereis 與 locate。